package com.itfenghuang.day17;

import com.itfenghuang.bean.User;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;

/*
请求对象
 */
public class A02_Request extends HttpServlet {
    /*
    1.请求对象中:
        1.获取路径的方法
        getContexPath()获取虚拟目录名称
        获取Servlet映射路径
        getServletPath()
        2.获取请求头的方法
        3.获取请求参数的方法

     2.HTTP协议的请求方式:
            get post
     3.get请求和post请求的区别
        1).get请求参数在地址栏传递,不安全.  post的请求菜蔬实在请求体中,相对安全
        2).get请求没有请求体,post有
        3).浏览器的长度是有限制的,大多数浏览器的地址栏长度不超过2kb,get请求参数有限制,post没有
     4.请求中文乱码问题
            1).get:
                omcat 8.5之后请求没有中文乱码问题
            2).post:
                中文乱码问题:使用请求对象中的方法 setCharacterEncoding(String name)
                建议以后每个Servlet中的doGet()方法都要加上解决请求乱码问题的方法
     5.请求参数封装成一个对象
        手动封装或者工具类封装

     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");//解决请求乱码问题的方法
//        获取路径的方法(req);
        获取请求头的方法(req);
//        System.out.println("呵呵呵");
//        获取请求对象的方法(req);
        String s = req.getParameter("username");
        String s1 = req.getParameter("password");
        String[] hb = req.getParameterValues("hobby");
        User user = new User(s, s1,hb);
        System.out.println(user);
    }

    private void 获取请求对象的方法(HttpServletRequest req) {
        //        获取请求参数的方法
        String username = req.getParameter("username");//根据请求参数名获取参数值
        String password = req.getParameter("password");
        String hb = req.getParameter("hobby");
        System.out.println(username);
        System.out.println(password);
        System.out.println(hb);
//        根据请求参数获取所有的值
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));
        System.out.println("--------------------");
//        获取所有请求参数的名称
        Enumeration<String> names = req.getParameterNames();
        while (names.hasMoreElements()){
//            单个的请求参数名
            String s = names.nextElement();
            String value = req.getParameter(s);
            System.out.println(s+"="+value);
        }
        System.out.println("============");
//        获取所有参数的键值对
        Map<String, String[]> map = req.getParameterMap();
//        map集合遍历方式  1 keySet()   2entrySet()
        Set<String> set = map.keySet();
        for (String s : set) {
            String[] values = map.get(s);
            System.out.println(s+"="+Arrays.toString(values));
        }
    }

    private void 获取请求头的方法(HttpServletRequest req) {
        //        根据请求头名称获取值   参数:请求头的名称
        String header = req.getHeader("Accept");
        System.out.println(header);
        String header1 = req.getHeader("Accept-Language");
        System.out.println(header1);
        System.out.println("----------------------");
//        获取指定请求头名称的多个值
        Enumeration<String> headers = req.getHeaders("Cookie");
        while (headers.hasMoreElements()){
            String s = headers.nextElement();
            System.out.println(s);
        }
        System.out.println("----------------");
//        获取所有的请求头名称
        Enumeration<String> name = req.getHeaderNames();
        while (name.hasMoreElements()){
            String names = name.nextElement();
            String value = req.getHeader(names);
            System.out.println(names+value);
        }
    }


    private void 获取路径的方法(HttpServletRequest req) {
        String s = req.getContextPath();
        System.out.println(s);
        String s1 = req.getServletPath();
        System.out.println("getServletPath()"+s1);
        String s2 = req.getRemoteAddr();
        System.out.println("getRemoteAddr()"+s2);
        String s3 = req.getQueryString();
        System.out.println("getQueryString()"+s3);
//        获取统一资源标识
        String s4 = req.getRequestURI();
        System.out.println("req.getRequestURI()"+s4);
//        获取统一资源定位符   协议+ip+端口号+s4
        StringBuffer s5 = req.getRequestURL();
        System.out.println("req.getRequestURL()"+s5);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
